ExtractIconEx (shell32)
Last changed: -218.224.236.114

.
Summary

C# Signature:

[DllImport("shell32.dll", CharSet=CharSet.Auto)]
static extern uint ExtractIconEx(string szFileName, int nIconIndex,
   IntPtr[] phiconLarge, IntPtr[] phiconSmall, uint nIcons);

VB Signature:

<DllImport("shell32.dll", CharSet:=CharSet.Auto)> _
Function ExtractIconEx(ByVal szFileName As String, _
            ByVal nIconIndex As Integer, _
            ByVal phiconLarge As IntPtr, _
            ByVal phiconSmall As IntPtr, _
            ByVal nIcons As UInteger) As UInteger
End Function

VB Signature:

Declare Function ExtractIconEx _
     Lib "shell32.dll" _
     Alias "ExtractIconExA" _
        (ByVal lpszFile As String, _
         ByVal nIconIndex As Integer, _
         ByRef phiconLarge As Integer, _
         ByRef phiconSmall As Integer, _
         ByVal nIcons As Long) As Integer

User-Defined Types:

None.

Notes:

None.

Tips & Tricks:

Please add some!

Sample Code:

namespace Martin.Hyldahl.Examples.ExtractIconEx
{
    /*
     * Example using ExtractIconEx
     * Created by Martin Hyldahl (alanadin@post8.tele.dk)
     * http://www.hyldahlnet.dk
     */

    using System;
    using System.Drawing;
    using System.Runtime.InteropServices;

    /// <summary>
    /// Example using ExtractIconEx
    /// </summary>
    public class ExtractIconExample
    {
    /* CONSTRUCTORS */
    static ExtractIconExample()
    {
    }

    // HIDE INSTANCE CONSTRUCTOR
    private ExtractIconExample()
    {
    }

    [DllImport("Shell32", CharSet=CharSet.Auto)]
    private static unsafe extern int ExtractIconEx (
        string lpszFile,
        int nIconIndex,
        IntPtr[] phIconLarge,
        IntPtr[] phIconSmall,
        int nIcons);

    [DllImport("user32.dll", EntryPoint="DestroyIcon", SetLastError=true)]
    private static unsafe extern int DestroyIcon(IntPtr hIcon);

    public static Icon ExtractIconFromExe(string file, bool large)
    {
        unsafe
        {
        int readIconCount = 0;
        IntPtr[] hDummy  = new IntPtr[1] {IntPtr.Zero};
        IntPtr[] hIconEx = new IntPtr[1] {IntPtr.Zero};

        try
        {
            if(large)
            readIconCount = ExtractIconEx(file,0, hIconEx, hDummy, 1);
            else
            readIconCount = ExtractIconEx(file,0, hDummy, hIconEx, 1);

            if(readIconCount > 0 && hIconEx[0] != IntPtr.Zero)
            {
            // GET FIRST EXTRACTED ICON
            Icon extractedIcon = (Icon)Icon.FromHandle(hIconEx[0]).Clone();

            return extractedIcon;
            }
            else // NO ICONS READ
            return null;
        }
        catch(Exception ex)
        {
            /* EXTRACT ICON ERROR */

            // BUBBLE UP
            throw new ApplicationException("Could not extract icon", ex);
        }
        finally
        {
            // RELEASE RESOURCES
            foreach(IntPtr ptr in hIconEx)
            if(ptr != IntPtr.Zero)
                DestroyIcon(ptr);

            foreach(IntPtr ptr in hDummy)
            if(ptr != IntPtr.Zero)
                DestroyIcon(ptr);
        }
        }
    }
    }
}

Alternative Managed API:

Do you know one? Please contribute it!

Documentation